from django.conf import settings
from itsdangerous import BadData
from itsdangerous import TimedJSONWebSignatureSerializer
from rest_framework.generics import CreateAPIView, RetrieveAPIView, UpdateAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from users import serializers
from users.models import User

'''
1. 判断用户名是否存在
根据前端注册页面分析用户名需要两个参数 用户名 和id
返回的json格式为
{
    'username':'itcast',
    'count': '1'
}


'''


# 1. 定义一个用户名数量统计的视图判断用户名是否存在
class UsernameCountView(APIView):  # 不对数据库修改继承父类
    '''
    # 根据前端分析 需要传两个参数给前端所以拼接字典返回这两个参数
       {
        'username': 'itcast',
        'count': '1'
    }
    '''

    # 定义一个get方法 获取前端传来的username
    def get(self, requset, username):

        # 1. 把传来的username放到数据库中查询用户的数量filter查询
        count = User.objects.filter(username=username).count()

        # 2.拼装成字典返回给前端

        data = {
            'username': username,
            'count': count
        }

        # 3. 将data字典返回给前端
        return Response(data)

# 2.判断手机号是否已经被注册过
# 要返回前端的json格式
'''
data = {
    'mobile':'mobile',
    'count':1

    }

'''


# 首先定义一个获取手机号的一个类
class UsermobileCountView(APIView):

    # 1.定义一个get方法获取手机号
    def get(self, request, mobile):

        # 查询该手机号在数据库中的数量
        count = User.objects.filter(mobile=mobile).count()

        # 拼装成字典格式
        data = {
            'mobile':mobile,
            'count':count
        }

        # 将数据返回给前端
        return Response(data)



# 用户注册后端接口设计
'''
因为将数据提交给数据库 所以是表单提交用post
根据表单分析得知需要返回如下数据
参数名	     类型	是否必须	说明
username	str	      是	    用户名
password	str	      是	    密码
password2	str	      是	    确认密码
sms_code	str	      是	    短信验证码
mobile	    str	      是	    手机号
allow	    布尔	      是	    是否同意用户协议

'''


# url(r'^users/$', views.UserView.as_view()),
# 数据验证放在序列化器中 views中负责调用序列化器
# 定义用户视图
class UserView(CreateAPIView):  # CreateAPIView? 这个类不太明白？
    '''
    用户注册传入的参数如下：定时
    username , password, password2， sms_code, mobile, allow


    '''
    # 定义序列化器（验证功能）
    serializer_class = serializers.CreateUserSerializer
    pass


# 用户详情视图
class UserDetailView(RetrieveAPIView):
    ''' 用户详情'''

    # 定义序列化器的类
    serializer_class = serializers.UserDrtailSerializer

    # 用户通过的认证
    permission_classes = [IsAuthenticated]

    def get_object(self):
        return self.request.user


# 定义一个修改用户邮箱的视图
class EmailView(UpdateAPIView):
    '''
    修改用户邮箱（修改用户邮箱的字段）

    '''

    # 只有通过身份验证的用户允许访问 二次验证保证接口加强安全
    permission_classes = [IsAuthenticated]

    # 调用序列化器 对用户输入的邮箱进行验证
    serializer_class = serializers.EmailSerializer

    # 重写GenericAPIView的方法，指定要修改的是哪一条用户数据
    def get_object(self):
        return self.request.user


# 定义一个激活用户邮箱的类
# url(r'^email/verification/$', views.VerifyEmailView.as_view()),
class VerifyEmailView(APIView):
    ''' 激活用户邮箱'''

    def get(self, request):

        # 获取token
        token = request.query_params.get('token')

        if not token:
            return Response({'message': '缺少token'}, status=400)

        # 验证token
        serializer = TimedJSONWebSignatureSerializer(
            settings.SECRET_KEY, expires_in=60 * 60 * 24)  # 有效期1天
        try:
            data = serializer.loads(token)
        except BadData:
            return Response({'message': '链接信息无效'}, status=400)

        # 查询要激活的用户对象
        email = data.get('email')
        user_id = data.get('user_id')

        try:
            user = User.objects.get(id=user_id, email=email)
        except User.DoesNotExist:
            return Response({'message': '激活的用户不存在'}, status=400)

        # 修改用户的激活状态
        user.email_active = True
        user.save()

        return Response({'message': 'OK'})
